//////////////////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////////////////
#define HOOK_ALLOC_TAG					'kooH'
#define MONITOR_INFO_EVENT_NAME			L"\\BaseNamedObjects\\MonitorInfoEvent"

//////////////////////////////////////////////////////////////////////////
// IO Control Codes
//////////////////////////////////////////////////////////////////////////
#define IOCTL_HOOK_INSTALL				CTL_CODE_AST(2000)
#define IOCTL_HOOK_UNINSTALL			CTL_CODE_AST(2001)
#define IOCTL_HOOK_SET_MONITOR_ITEM		CTL_CODE_AST(2002)
#define IOCTL_HOOK_GET_MONITOR_INFO		CTL_CODE_AST(2003)

//////////////////////////////////////////////////////////////////////////
// Functions
//////////////////////////////////////////////////////////////////////////
VOID InitializeHook();
VOID DisposeHook();
BOOLEAN ProcessIoCtlForHook(ULONG ioControlCode, PDEVICE_OBJECT deviceObject, PIRP irp, PIO_STACK_LOCATION irpStack);

VOID ProcessHook(PIRP irp, BOOLEAN isInstall);
VOID ProcessSetMonitorItem(PIRP irp, PIO_STACK_LOCATION irpStack);
VOID ProcessGetMonitorInfo(PIRP irp, PIO_STACK_LOCATION irpStack);

VOID EmptyHookLists();
VOID HookInternal(PVOID *pParams);
VOID HookEntry();
ULONG HookFilter(ULONG serviceTableBase, ULONG funcIndex, ULONG origFuncAddress, ULONG paramByteCount, PULONG paramAddress);
BOOLEAN RemoveMonitorItem(ULONG functionIndex);

//////////////////////////////////////////////////////////////////////////
// Structures
//////////////////////////////////////////////////////////////////////////
typedef struct _HOOK_SET_MONITOR_ITEM_REQUEST {
	ULONG ServiceTableBase;
	ULONG FunctionIndex;
	ULONG ReloadedFunctionAddress;
	BOOLEAN IsMonitor;
} HOOK_SET_MONITOR_ITEM_REQUEST, *PHOOK_SET_MONITOR_ITEM_REQUEST;

typedef struct _MONITOR_ITEM {
	LIST_ENTRY ListEntry;
	ULONG ServiceTableBase;
	ULONG FunctionIndex;
	ULONG ReloadedFunctionAddress;
} MONITOR_ITEM, *PMONITOR_ITEM;

typedef struct _MONITOR_INFO_ITEM_DATA {
	ULONG ProcessId;
	LONG FunctionIndex;
	ULONG FunctionAddress;
	ULONG ParameterCount;
	ULONG Parameters[20];
} MONITOR_INFO_ITEM_DATA, *PMONITOR_INFO_ITEM_DATA;

typedef struct _MONITOR_INFO_ITEM {
	LIST_ENTRY ListEntry;
	MONITOR_INFO_ITEM_DATA Data;
} MONITOR_INFO_ITEM, *PMONITOR_INFO_ITEM;

